/*
 * @Author: wei_jt@ecidi.com
 * @Date: 2022-06-24 16:22:36
 * @LastEditors: wei_jt@ecidi.com
 * @LastEditTime: 2022-06-28 10:40:34
 * @Description: file content
 */

let handler
let echartFactory
const echarts = {
  init: (...args) => {
    let container = {
      // initFlag标志着echart是否已初始化，false代表未初始化，true代表已初始化
      initFlag: false,
      // 记录在未初始化完之前，主函数中要执行的方法都会存放在fns里面
      fns: [],
      // 待初始化的实例，在加载后所有方法都会在在echart中实现
      echart: undefined
    }
    echartFactory.create(args)
      .then(echart => {
        container.echart = echart
        container.fns.forEach(({ fn, args }) => {
          if (typeof (echart[fn]) === 'function')
            echart[fn].apply(echart, args)
        })
        container.initFlag = true
      })
    return new Proxy(container, handler)
  }
}

handler = {
  get: function (target, key) {
    if (!target.initFlag) {
      // container中的echart未加载时，收集要执行的程序的名称和参数以对象的形式存放在fns中
      return (...args) => {
        target.fns.push({
          fn: key,
          args
        })
      }
    } else {
      // 当echarts初始化完成后，直接返回方法
      if (key in target.echart) {
        return target.echart[key]
      } else {
        return undefined
      }
    }
  }
}

echartFactory = {
  // 存放从外部加载的echarts模块
  _echart: undefined,
  create: async function (args) {
    if (!this._echart) {
      this._echart = await import('echarts')
    }
    return this._echart.init.apply(undefined, args)
  }
}

export default echarts